package controlador;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import modelo.Cliente;
import modelo.DetalleOrden;
import modelo.DetalleProducto;
import modelo.Ingrediente;
import modelo.Producto;
import modelo.Sentencias;
import modelo.Orden;
import vista.VistaOrden;
import vista.VistaCliente;

public class ControladorOrden implements ActionListener,FocusListener {
	public VistaOrden vOrden;
	public Orden orden;
	public static Vector<DetalleOrden> detalles; 
	List<Ingrediente> listaIngrediente=new ArrayList<Ingrediente>();
	
	int i=0;
	Sentencias MyConex;
	public ControladorOrden(VistaOrden vo){
		vOrden=vo;
		detalles=new Vector<DetalleOrden>();
	}
		public void actionPerformed(ActionEvent ae) {
			if(ae.getSource()== vOrden.btnSalir)
			{
				int opcion = JOptionPane.showConfirmDialog(new JFrame(),"Desea volver al menu anterior?",
						     "Mensaje de Confirmacion",JOptionPane.YES_NO_OPTION,
						     JOptionPane.QUESTION_MESSAGE);
				if (opcion == JOptionPane.YES_OPTION)
					vOrden.dispose();
			}
			if(ae.getSource()== vOrden.btnRegistrar){
				if(validarCampos()){
				Sentencias MyConex= new Sentencias();
				orden = new Orden(vOrden.txtCedula.getText(),vOrden.txtCodOrden.getText(),vOrden.txtFecha.getText(),Float.parseFloat(vOrden.txtTotal.getText()));
				if(detalles.size()==0)
					JOptionPane.showMessageDialog(new JFrame(), 
							"La orden Debe tener por lo menos 1 detalle","Orden",
							JOptionPane.WARNING_MESSAGE);
				else{
				MyConex.insetarDatosOrden(orden);
				MyConex.insetarProductosOrden(detalles);
				detalles.clear();
				limpiarCampos();
				MyConex.ActualizarIngredientesPorCompra(listaIngrediente);
				JOptionPane.showMessageDialog(new JFrame(), 
						"La orden se ha registrado exitosamente","Orden", 
						JOptionPane.INFORMATION_MESSAGE);
				}
				}
				else
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor introduzca la cedula y/o fecha","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
			}
			if(ae.getSource()== vOrden.btnRegProducto){
				MyConex= new Sentencias();
				boolean encontrado,agotado=false;
				float existenciaActual,total=0;
				String cantidad=vOrden.txtCantidad.getText();
				String nombre=vOrden.jcbProductos.getSelectedItem().toString();
				if(nombre.equals("Seleccione una Categoria") || nombre.equals("No tiene productos") || cantidad.equals(""))
					JOptionPane.showMessageDialog(new JFrame(), 
							"Fijese que halla seleccionado una categoria,producto y/o cantidad asignado una cantidad","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
				else
				{
				int cantidadPedida=Integer.parseInt(vOrden.txtCantidad.getText());
				String codProducto=MyConex.ObtenerCodProducto(vOrden.jcbProductos.getSelectedItem().toString());
				List<DetalleProducto> listaDetalleProducto=MyConex.cargarIngredientesPorProductosCod(codProducto);
				Iterator iterador=listaDetalleProducto.iterator();
				Ingrediente ingrediente1,ingrediente2;
				DetalleProducto detalleProducto;
				if(!listaIngrediente.isEmpty()){
					Iterator iterador2=listaIngrediente.iterator();
					agotado=false;
					while(iterador.hasNext()){
						encontrado=false;
						detalleProducto=(DetalleProducto) iterador.next();
						float cantidadTotal=cantidadPedida*detalleProducto.getCantidad();
						ingrediente1=MyConex.obtenerIngrediente(detalleProducto.getCodIngrediente());
					     while(iterador2.hasNext()){
							ingrediente2=(Ingrediente)iterador.next();
							if(ingrediente2.getCodIngrediente().toString().compareTo(ingrediente1.getCodIngrediente().toString())==0){
								if(cantidadTotal>ingrediente2.getExistencia()){
									JOptionPane.showMessageDialog(new JFrame(), 
											"No se puede realizar el pedido por falta de '"+ingrediente1.getDescripcion()+"'","Orden", 
											JOptionPane.INFORMATION_MESSAGE);
									agotado=true;
								}
								else{
									existenciaActual=ingrediente2.getExistencia()-cantidadTotal;
									ingrediente2.setExistencia(existenciaActual);
							           }
								encontrado=true;
						     }		
					}
					if(!encontrado){
						    if(cantidadTotal>ingrediente1.getExistencia()){
								JOptionPane.showMessageDialog(new JFrame(), 
										"No se puede realizar el pedido por falta de '"+ingrediente1.getDescripcion()+"'","Orden", 
										JOptionPane.INFORMATION_MESSAGE);
						    agotado=true;}
							    else{
							       ingrediente1.setExistencia(ingrediente1.getExistencia()-cantidadTotal);
							        listaIngrediente.add(ingrediente1);
							        }
					                 }	
					}
					}	
				else{
					while(iterador.hasNext()){
						detalleProducto=(DetalleProducto) iterador.next();
						float cantidadTotal=cantidadPedida*detalleProducto.getCantidad();
						ingrediente1=MyConex.obtenerIngrediente(detalleProducto.getCodIngrediente());
						if(cantidadTotal>ingrediente1.getExistencia()){
							JOptionPane.showMessageDialog(new JFrame(), 
									"No se puede realizar el pedido por falta de '"+ingrediente1.getDescripcion()+"'","Orden", 
									JOptionPane.INFORMATION_MESSAGE);
						agotado=true;}
						else{
						ingrediente1.setExistencia(ingrediente1.getExistencia()-cantidadTotal);
					    listaIngrediente.add(ingrediente1);
						}
				       }
				}	
				DetalleOrden detalleOrden;
				if(!agotado){
				float totalActual=Float.parseFloat(vOrden.txtTotal.getText());
				Producto producto=MyConex.obtenerProducto(codProducto);
				total=total+(producto.getPrecio()*cantidadPedida);
				vOrden.txtTotal.setText(String.valueOf(total+totalActual));
				detalleOrden = new DetalleOrden(Integer.parseInt(vOrden.txtCantidad.getText()),vOrden.txtCodOrden.getText(),codProducto);
				detalles.add(detalleOrden);
				vOrden.tablaModel.setRowCount(detalles.size());
				vOrden.tablaModel.setValueAt(detalleOrden.getCodOrden(),	vOrden.tablaModel.getRowCount()-1,0);
				vOrden.tablaModel.setValueAt(vOrden.jcbProductos.getSelectedItem().toString(),vOrden.tablaModel.getRowCount()-1,1);
				vOrden.tablaModel.setValueAt(detalleOrden.getCantidad(),vOrden.tablaModel.getRowCount()-1,2);
				vOrden.tablaProductos.setShowGrid(true);
				vOrden.tablaProductos.setShowHorizontalLines(true);
				vOrden.tablaProductos.setPreferredScrollableViewportSize(new Dimension(50,25));
				}
				}
								}
			if(ae.getSource()== vOrden.btnRemover){
				int indice=vOrden.tablaProductos.getSelectedRow();
				if(indice>=0){
				MyConex = new Sentencias();
				String nombreProducto=String.valueOf(vOrden.tablaModel.getValueAt(indice,1));
				int cant=Integer.parseInt(String.valueOf(vOrden.tablaModel.getValueAt(indice,2)));
				vOrden.tablaModel.removeRow(indice);
				float totalActual=Float.parseFloat(vOrden.txtTotal.getText());
				String codproducto=MyConex.ObtenerCodProducto(nombreProducto);
				Producto producto=MyConex.obtenerProducto(codproducto);
				float total=producto.getPrecio()*cant;
				vOrden.txtTotal.setText(String.valueOf(totalActual-total));
				detalles.remove(indice);
				}
				else
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor seleccione el producto que desea remover","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
			}
			if(ae.getSource()== vOrden.btnBuscar){
				String codorden=vOrden.txtCodOrden.getText();
				if(codorden.equals(""))
					JOptionPane.showMessageDialog(new JFrame(), 
							"Por favor introduzca el codigo de la orden","Orden", 
							JOptionPane.ERROR_MESSAGE);
				else{
				MyConex = new Sentencias();
				Orden orden=MyConex.obtenerOrden(codorden);
				if(orden==null){
					JOptionPane.showMessageDialog(new JFrame(), 
							"La Orden no se encuentra registrada","Orden", 
							JOptionPane.INFORMATION_MESSAGE);
				noEncontrado();
				}
				else{
					vOrden.txtCedula.setText(orden.getCedula());
					vOrden.txtFecha.setText(orden.getFecha());
					vOrden.txtTotal.setText(String.valueOf(orden.getTotalPagar()));
				}
				}
				}
			if(ae.getSource()== vOrden.JcbCategorias){
				vOrden.jcbProductos.removeAllItems();
				MyConex = new Sentencias();
				String nombre=vOrden.JcbCategorias.getSelectedItem().toString();
				Vector<String> descripcionProducto=MyConex.cargarProductosCodicionados(nombre);
				if(descripcionProducto.size()!=0){
				for(int i=0;i<descripcionProducto.size();i++){
					nombre=descripcionProducto.get(i);
				vOrden.jcbProductos.addItem(nombre);
				}	
				}
				else
					vOrden.jcbProductos.addItem("No tiene productos");
					
			}
			if(ae.getSource()== vOrden.txtFecha){
				System.out.println("hola");
			}
			
		}
		public boolean validarCampos(){
			boolean validar=true;
			if(vOrden.txtCedula.getText().equals("") || vOrden.txtFecha.getText().equals(""))
				validar=false;
			return validar;
		}
		public void limpiarCampos(){
			vOrden.txtCantidad.setText("");
			vOrden.txtCedula.setText("");
			vOrden.txtCodOrden.setText("");
			vOrden.txtTotal.setText("0");
			vOrden.tablaProductos.removeAll();
			vOrden.txtCodOrden.requestFocus(true);
			desActivar();
				}
		public void encontrado(){
			vOrden.txtCedula.setEditable(false);
			vOrden.btnLimpiar.setEnabled(true);
			vOrden.btnRegistrar.setEnabled(false);
		}
		public void noEncontrado(){
			vOrden.btnRegistrar.setEnabled(true);
			vOrden.btnRegProducto.setEnabled(true);
			vOrden.btnRemover.setEnabled(true);
			vOrden.txtCedula.setEditable(true);
			vOrden.txtCantidad.setEditable(true);
			vOrden.txtFecha.setEditable(true);
			vOrden.JcbCategorias.setEnabled(true);
			vOrden.jcbProductos.setEnabled(true);
			vOrden.btnLimpiar.setEnabled(true);
			vOrden.txtCodOrden.setEditable(false);
		}
		public void desActivar(){
			vOrden.btnRegistrar.setEnabled(false);
			vOrden.txtCedula.setEditable(false);
			vOrden.txtCantidad.setEditable(false);
			vOrden.btnLimpiar.setEnabled(false);
			vOrden.txtCodOrden.setEditable(true);	
			
		}
		public void inicio(){
			vOrden.btnRegistrar.setEnabled(false);
			vOrden.btnLimpiar.setEnabled(false);
		    limpiarCampos();
			
		}
		public void focusGained(FocusEvent arg0) {}
		public void focusLost(FocusEvent fe) {
		//	if(ae.getSource()== vOrden.btnRegistrar){
			MyConex = new Sentencias();
			Cliente cliente=MyConex.obtenerCliente(vOrden.txtCedula.getText());
			if(cliente==null){
					int opcion = JOptionPane.showConfirmDialog(new JFrame(),"El cliente no see cnuentra registrado, desea registrarlo?",
						     "Mensaje de Confirmacion",JOptionPane.YES_NO_OPTION,
						     JOptionPane.QUESTION_MESSAGE);
				if (opcion == JOptionPane.YES_OPTION)
				{
					VistaCliente vCliente=new VistaCliente();
					vCliente.setVisible(true);
				}
			}
		}
		
		

}
